#include<unistd.h>
#include<iostream>
#include<pthread.h>
using namespace std;
pthread_mutex_t mtx;//互斥锁
pthread_cond_t cond;//条件变量
//主线程:创建1个负责控制的线程master + 3个负责工作的线程
//让master控制这3个工作线程,这三个线程在条件变量下进行等待,直到被master线程唤醒
void* ctrl(void* arg) //控制线程的例程函数
{
  string name = (char*)arg;
  while(1)
  {
    cout << name <<"say :begin work..."<<endl;
    pthread_cond_signal(&cond);//唤醒在条件变量等待队列当中等待的第一个进程
    sleep(1);
  }
}
void* work(void* arg) //工作线程的例程函数
{
  int number = *(int*)arg; //工作线程的编号
  delete (int*)arg; //拿到了编号之后就把arg对象销毁,防止内存泄漏
  while(1)
  {
    pthread_cond_wait(&cond,&mtx);//在条件变量下进行等待
    cout << "worker "<<number<<" is working...."<<endl;
  }
}
#define NUM 3
int main()
{
  //0.初始化互斥锁和条件变量
  pthread_mutex_init(&mtx,NULL); 
  pthread_cond_init(&cond,NULL);
  //1.创建控制线程和工作线程
  pthread_t master;
  pthread_t worker[NUM];
  pthread_create(&master,NULL,ctrl,(void*)"Boss");
  for(int i = 0;i<NUM;i++)
  {
    int* number = new int(i);//线程编号
    pthread_create(&worker[i],NULL,work,(void*)number);
  }

  //线程等待
  pthread_join(master,nullptr);
  for(int i = 0;i<NUM;i++)
    pthread_join(worker[i],nullptr);
  //4.销毁互斥锁和条件变量
  pthread_mutex_destroy(&mtx);
  pthread_cond_destroy(&cond);
   return 0;
}
